package 大厂面试;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.IdUtil;

import java.util.UUID;

/**
 * 1.JAVA
 *      UUID.randomUUID()  可保证唯一
 * 2.MySQL  ：
 *      CREATE TABLE t_test (
 *      id BIGINT (20)
 *      UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 *      stub CHAR(1) NOT NULL DEFAULT '',
 *      UNIQUE KEY stub (stub)
 *       )
 *       SELECT * FROM t_test;
 *       REPLACE INTO t_test (stub) VALUES('b') ; //没有添加，有替换
 *       SELECT LAST INSERT ID() ;
 *       //这个ID 唯一 且递增   需要设计步长不容易扩展
 *       但是不能横向扩容，且并发量低  不能支持高QPS
 *
 * 3.Redis： 原子操作   INCR 和 INCRBY 来实现
 *      这个ID 唯一 且递增   速度快
 *      但是需要维护 多台Redis 浪费资源
 * 4.雪花算法  Twitter(推特美国的聊天软件) 分布式自增ID算法 snowflake
 *
 *   twitter的snowflake解决了这种需求，最初Twitter把存储系统从MySQL迁移到
 *      Cassandra(由Facebook开发一套 开源分布式NoSQL数据库系统)因
 *      为Cassandra没有顺序ID生成机制，所以开发了这样: 套全局唯一ID生成服 务。
 *   Twitter的分布式雪花算法SnowFlake，经测试snowflake每秒能够产生26万个自增可排序的ID
 *
 *   1、twitter的SnowFlake 生成ID能够按照时间有序生成
 *   2、SnowFlake算法生p成id的结果 是一个64bit大小的整数， 为一个Long型(转换成字符串后长度最多19)。
 *   3、分布式系统内不会产生ID碰撞(由 datacenter和 workerld 作区分)并且效率较高。
 *
 *   分布式系统中，有一些需要使用全局唯一ID的场景， 生成ID的基本要求
 *   1.在分布式的环境下必须全局且唯一。
 *   2.一般都需要单调递增,因为一般唯一ID都会存到数据库,而Innodb的特性就是将内容存储在主键索引树上的叶子节点，而且是从左往右，递增的，
 *
 *   所以考虑到数据库性能,一般生成的id 也最好是单调递增。
 *   为了防止ID冲突可以使用36位的UUID，但是UUID有一些缺点，首先他相对比较长，另外UUID般是无序的
 *
 * 雪花算法：  64bit大小的整数
 * 1+41+10+12
 * 1： 符号位           默认为 0 且不用
 * 41：时间戳           时间戳
 * 10：工作进程位        五位  datacenterid  五位 workerid        =1024
 * 12：序列号位          4096   一毫秒可以产生 4096 个 ID
 *
 */
public class 唯一ID之雪花算法 {
    public static void main(String[] args) {

    }
}
